iT邦幫忙

0

React-使用JSON增加品項

  • 分享至 

  • xImage
  •  

這邊的功能是為了想呈現網頁中作品集這個項目
但是在作品集中又分了很多品項
像是平面、網頁、插畫等等..
於是在最外層先放上一格一格的分類圖
點進分類圖之後
會跳出一個蓋板框
蓋板框內存放著該分類的圖片與資訊
為了簡化程式碼
在這邊使用了JSON來存取文字資訊
然後定義好內的內容之後
使用map()來呈現每一個分類

一開始先寫好JSON內的資訊workData

[{
    "id":1,
    "title1":"Graphic Design",
    "title2":"插畫設計",
    "link":"illastration_design-head",
    "link2":"illastration_design",
    "alt":"graphic_design"
},
{
    "id":2,
    "title1":"Graphic Design",
    "title2":"BANNER設計",
    "link":"graphic_design-head",
    "link2":"graphic_design",
    "alt":"graphic_design"
},
{
    "id":3,
    "title1":"UI Design",
    "title2":"Jabra耳機APP UI設計(仿作)",
    "link":"jabra_ui_design-head",
    "link2":"jabra_ui_design",
    "alt":"ui_design"
}]

在這邊先解釋
id是為了能放在li裡面的key
title為標題
link為圖片的連結
alt是圖片的alt

接下來放上整段程式碼

const [openWork,setOpenWork]=useState(false);
const [toLink,setLink]=useState('');
const [tit1,setTit1]=useState('');
const [tit2,setTit2]=useState('');
const handleOpen=(link,title1,title2)=>{
	setOpenWork(true);
	setLink(link);
	setTit1(title1);
	setTit2(title2);
        }
const handleClose=()=>{
	setOpenWork(false);
	setLink('');
        }
const op={opacity:openWork?'1':'0',
  transform:openWork?'scale(1)':'scale(0)',
  overflow:openWork?'scroll':'hidden'
  }

<ul id="allPortfolioUl">
  {workData.map(wk=>(
  <li key={wk.id}>
    <div className='box'  onClick={()=>{handleOpen(wk.link2,wk.title1,wk.title2)}}>
      <a>
        <div className="title">
          <div className="titleCenter">
            <h4>{wk.title1}</h4>
            <p className="titleCenterP">{wk.title2}</p>
          </div>
        </div>
		  					
        <img src={`img/work/${wk.link}.jpg`} alt={wk.alt}/>
      </a>
    </div>

    <div className="portPage" style={op}>
      <div className="closeP" onClick={handleClose}>x</div>
      <div className="pageWrap">
        <div className="portTitle">
          <h4>{tit1}</h4>
          <p className="titleCenterP">{tit2}</p>
          <hr className="shortColorBar"/>
        </div>
        <img src={`img/work/${toLink}.jpg`} alt={wk.alt}/>
      </div>
      <div className="closePB" onClick={handleClose}>x</div>
    </div>

  </li>
  ))}                       
</ul>

首先引入workData這個JSON檔
並使用map()把li排列出來
並定義li內的key
這邊若沒有定義key在console內會報錯
接著這邊我分為兩個主要區塊
一個是box與portpage
box為一開始排列在畫面上的分類
點到了這個box會跳出potpage這個視窗
這裡的

onClick={()=>{handleOpen(wk.link2,wk.title1,wk.title2)}}

為什麼會傳入這麼多參數
是因為若不傳入這些參數
在點擊任何一個box進入後
所獲得的資訊都會是最後一個id(全部一起)傳入的內容
所以我們必須指定
點擊到哪個連結會傳入相對應的參數

接著使用useState來定義點擊時的狀態
與傳入參數時的狀態改變

const [openWork,setOpenWork]=useState(false);
const [toLink,setLink]=useState('');
const [tit1,setTit1]=useState('');
const [tit2,setTit2]=useState('');

const op={opacity:openWork?'1':'0',
  transform:openWork?'scale(1)':'scale(0)',
  overflow:openWork?'scroll':'hidden'
}

一開始狀態setOpenWork設定為false
也就是portpage的opacity為0
並且將傳入參數title1、title2、link2
都設為空字串

點擊box之後
透過handleOpen改變參數

const handleOpen=(link,title1,title2)=>{
	setOpenWork(true);
	setLink(link);
	setTit1(title1);
	setTit2(title2);
        }
const handleClose=()=>{
	setOpenWork(false);
	setLink('');
        }

setOpenWork改變為true
另外三個狀態都改變為對應參數
傳入portpage
按下handleClose後
setOpenWork又變回false
並且將圖片連結設為空字串
這邊為什麼圖片連結要變回空字串呢?
因為這邊發現到了一個問題
就是若沒有再改回空字串
進入第一個box退出後
在點擊第二個box
會先出現第一個box的圖片
再顯示出第二個box的圖片
所以這邊得做一個清除第一個圖片的動作


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言